/**
 ******************************************************************************
 * @file           : example.c
 * @brief          : MicroLog usage examples
 * @version        : 1.1.0
 * @date           : 2025-10-18
 ******************************************************************************
 * @note  本文件包含 MicroLog 的完整使用示例
 *        包括：基础输出、级别控制、模块过滤、HEX转储等
 ******************************************************************************
 */

/* 定义本文件的日志标签（必须在 #include "log.h" 之前）*/
#define LOG_TAG  "EXAMPLE"

#include "log.h"
#include <stdio.h>

/* ================================ 示例1：基础使用 ================================ */
void example_basic(void)
{
    printf("\n========== 示例1：基础日志输出 ==========\n\n");
    
    /* 使用预定义标签输出不同级别的日志 */
    LOG_F(TAG_SYSTEM, "Fatal error occurred!");
    LOG_E(TAG_SYSTEM, "Error code: %d", 404);
    LOG_W(TAG_TEMP, "Temperature warning: %d°C", 85);
    LOG_I(TAG_APP, "Application started successfully");
    LOG_D(TAG_PARAM, "Parameter loaded: %d bytes", 1024);
    LOG_T(TAG_FLOW, "Flow measurement: %.2f L/min", 3.14);
}

/* ================================ 示例2：全局级别控制 ================================ */
void example_global_level(void)
{
    printf("\n========== 示例2：全局级别控制 ==========\n\n");
    
    /* 设置全局级别为 WARN，只显示 WARN 及以上级别 */
    printf(">>> 设置全局级别为 WARN\n");
    log_set_global_level(LOG_LEVEL_WARN);
    
    LOG_E(TAG_SYSTEM, "Error: this will show");       // ✅ 显示
    LOG_W(TAG_SYSTEM, "Warning: this will show");     // ✅ 显示
    LOG_I(TAG_SYSTEM, "Info: this won't show");       // ❌ 不显示
    LOG_D(TAG_SYSTEM, "Debug: this won't show");      // ❌ 不显示
    
    /* 恢复为 INFO 级别 */
    printf("\n>>> 恢复全局级别为 INFO\n");
    log_set_global_level(LOG_LEVEL_INFO);
    
    LOG_I(TAG_SYSTEM, "Info: now it shows again");    // ✅ 显示
}

/* ================================ 示例3：模块级别过滤 ================================ */
void example_module_filter(void)
{
    printf("\n========== 示例3：模块级别过滤 ==========\n\n");
    
    /* 场景：全局只看 ERROR，但想看 ADC 模块的 DEBUG */
    printf(">>> 全局ERROR级别，但ADC模块DEBUG级别\n");
    log_set_global_level(LOG_LEVEL_ERROR);
    log_set_tag_level(TAG_ADC, LOG_LEVEL_DEBUG);
    
    LOG_E(TAG_SYSTEM, "System error");                // ✅ 显示（符合全局）
    LOG_I(TAG_SYSTEM, "System info");                 // ❌ 不显示（被全局过滤）
    LOG_D(TAG_ADC, "ADC channel 1: %d", 2048);        // ✅ 显示（模块优先）
    LOG_I(TAG_ADC, "ADC initialized");                // ✅ 显示（模块优先）
    
    /* 清除 ADC 模块过滤 */
    printf("\n>>> 清除ADC模块过滤\n");
    log_clear_tag_level(TAG_ADC);
    
    LOG_D(TAG_ADC, "ADC debug");                      // ❌ 不显示（使用全局）
    LOG_E(TAG_ADC, "ADC error");                      // ✅ 显示（使用全局）
    
    /* 恢复默认 */
    log_set_global_level(LOG_LEVEL_INFO);
}

/* ================================ 示例4：格式配置 ================================ */
void example_format_config(void)
{
    printf("\n========== 示例4：格式配置 ==========\n\n");
    
    /* 完整格式（所有字段）*/
    printf(">>> 完整格式（时间+级别+标签+函数+行号）\n");
    log_set_fmt(LOG_LEVEL_INFO, LOG_FMT_ALL);
    LOG_I(TAG_SYSTEM, "Full format message");
    
    /* 简洁格式（级别+标签）*/
    printf("\n>>> 简洁格式（级别+标签）\n");
    log_set_fmt(LOG_LEVEL_INFO, LOG_FMT_SIMPLE);
    LOG_I(TAG_SYSTEM, "Simple format message");
    
    /* 最简格式（只有级别）*/
    printf("\n>>> 最简格式（只有级别）\n");
    log_set_fmt(LOG_LEVEL_INFO, LOG_FMT_MINIMAL);
    LOG_I(TAG_SYSTEM, "Minimal format message");
    
    /* 恢复默认格式 */
    printf("\n>>> 恢复默认格式\n");
    log_set_fmt(LOG_LEVEL_INFO, LOG_FMT_TIME | LOG_FMT_LVL | LOG_FMT_TAG);
    LOG_I(TAG_SYSTEM, "Default format restored");
}

/* ================================ 示例5：HEX转储 ================================ */
void example_hex_dump(void)
{
    printf("\n========== 示例5：HEX转储 ==========\n\n");
    
    /* 准备测试数据 */
    uint8_t buffer1[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
    uint8_t buffer2[] = {
        0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F,  // "Hello Wo"
        0x72, 0x6C, 0x64, 0x21, 0x00, 0xFF, 0xAA, 0x55   // "rld!.ÿªU"
    };
    
    /* 输出8字节数据 */
    printf(">>> 转储8字节数据\n");
    LOG_HEX_I(TAG_SYSTEM, buffer1, sizeof(buffer1));
    
    /* 输出16字节数据（包含可打印字符）*/
    printf("\n>>> 转储16字节数据（包含ASCII字符）\n");
    LOG_HEX_I(TAG_SYSTEM, buffer2, sizeof(buffer2));
    
    /* 输出32字节数据（多行）*/
    printf("\n>>> 转储32字节数据（多行显示）\n");
    uint8_t large_buffer[32];
    for (int i = 0; i < 32; i++) {
        large_buffer[i] = i;
    }
    LOG_HEX_D(TAG_SYSTEM, large_buffer, sizeof(large_buffer));
}

/* ================================ 示例6：原始输出 ================================ */
void example_raw_output(void)
{
    printf("\n========== 示例6：原始输出 ==========\n\n");
    
    /* 使用 LOG_RAW 输出不带格式的文本 */
    LOG_RAW("========================================\n");
    LOG_RAW("          System Test Report          \n");
    LOG_RAW("========================================\n");
    
    LOG_I(TAG_SYSTEM, "Test 1: Memory check");
    LOG_I(TAG_SYSTEM, "Test 2: Peripheral init");
    LOG_I(TAG_SYSTEM, "Test 3: Communication test");
    
    LOG_RAW("========================================\n");
    LOG_RAW("        All Tests Passed! ✓           \n");
    LOG_RAW("========================================\n");
}

/* ================================ 示例7：动态控制 ================================ */
void example_dynamic_control(void)
{
    printf("\n========== 示例7：动态控制 ==========\n\n");
    
    /* 禁用日志输出 */
    printf(">>> 禁用日志输出\n");
    log_set_output_enabled(false);
    LOG_I(TAG_SYSTEM, "This won't show");
    LOG_E(TAG_SYSTEM, "This won't show either");
    printf("（日志已被禁用，上面两条看不到）\n");
    
    /* 重新启用日志输出 */
    printf("\n>>> 重新启用日志输出\n");
    log_set_output_enabled(true);
    LOG_I(TAG_SYSTEM, "Now it shows again!");
}

/* ================================ 示例8：自定义输出函数 ================================ */
static int custom_log_count = 0;

void my_custom_output(const char *str)
{
    /* 自定义输出：添加行号 */
    printf("[Line %03d] %s", ++custom_log_count, str);
}

void example_custom_output(void)
{
    printf("\n========== 示例8：自定义输出函数 ==========\n\n");
    
    printf(">>> 使用自定义输出函数（添加行号）\n");
    log_set_output(my_custom_output);
    
    LOG_I(TAG_SYSTEM, "First message");
    LOG_I(TAG_SYSTEM, "Second message");
    LOG_E(TAG_SYSTEM, "Third message");
    
    /* 恢复默认输出 */
    printf("\n>>> 恢复默认输出函数\n");
    log_set_output(NULL);
    LOG_I(TAG_SYSTEM, "Back to default output");
}

/* ================================ 示例9：实际应用场景 ================================ */
void example_real_world(void)
{
    printf("\n========== 示例9：实际应用场景 ==========\n\n");
    
    /* 模拟系统启动流程 */
    LOG_I(TAG_SYSTEM, "System booting...");
    LOG_D(TAG_SYSTEM, "CPU Clock: %d MHz", 168);
    
    /* 模拟外设初始化 */
    LOG_I(TAG_ADC, "ADC initializing...");
    LOG_D(TAG_ADC, "Calibration value: 0x%04X", 0x1234);
    LOG_I(TAG_ADC, "ADC initialized successfully");
    
    /* 模拟参数加载 */
    LOG_I(TAG_PARAM, "Loading parameters from EEPROM...");
    uint8_t param_data[] = {0x12, 0x34, 0x56, 0x78};
    LOG_HEX_D(TAG_PARAM, param_data, sizeof(param_data));
    LOG_I(TAG_PARAM, "Parameters loaded: %d bytes", sizeof(param_data));
    
    /* 模拟错误处理 */
    int error_code = -1;
    if (error_code < 0) {
        LOG_E(TAG_TEMP, "Temperature sensor error: code %d", error_code);
        LOG_W(TAG_SYSTEM, "System running in degraded mode");
    }
    
    /* 模拟正常运行 */
    LOG_I(TAG_APP, "Application running...");
    LOG_T(TAG_FLOW, "Flow rate: %.2f L/min", 5.67);
    LOG_T(TAG_TEMP, "Temperature: %d°C", 23);
}

/* ================================ 示例10：性能测试 ================================ */
void example_performance(void)
{
    printf("\n========== 示例10：编译期优化演示 ==========\n\n");
    
    /* 说明：在 Release 模式下（LOG_COMPILE_LEVEL = INFO）
     * DEBUG 和 TRACE 级别的日志会被完全编译掉，不占用 ROM */
    
    printf(">>> Debug模式：所有日志都编译\n");
    printf(">>> Release模式：DEBUG/TRACE不编译\n\n");
    
    LOG_I(TAG_SYSTEM, "This compiles in both Debug and Release");
    LOG_D(TAG_SYSTEM, "This compiles only in Debug mode");
    LOG_T(TAG_SYSTEM, "This compiles only in Debug mode");
    
    printf("\n提示：查看 log_cfg.h 中的 LOG_COMPILE_LEVEL 配置\n");
}

/* ================================ 示例11：文件级标签 ================================ */
void example_file_tag(void)
{
    printf("\n========== 示例11：文件级标签（推荐方式）==========\n\n");
    
    printf("文件级标签是最简洁的使用方式，每个源文件定义自己的标签\n\n");
    
    /* 代码示例说明 */
    printf("示例代码：\n");
    printf("--------------------------------------------------\n");
    printf("/* motor.c */\n");
    printf("#define LOG_TAG  \"MOTOR\"    /* 定义本文件标签 */\n");
    printf("#include \"log.h\"\n\n");
    printf("void motor_init(void) {\n");
    printf("    log_i(\"电机初始化\");              // [MOTOR   ]\n");
    printf("    log_d(\"PWM频率：%%d Hz\", 1000);    // [MOTOR   ]\n");
    printf("    log_e(\"错误码：%%d\", -1);          // [MOTOR   ]\n");
    printf("}\n");
    printf("--------------------------------------------------\n\n");
    
    /* 实际调用演示 */
    printf(">>> 三种使用方式对比（实际输出）：\n\n");
    
    /* 方式1：显式标签 */
    printf("1. 显式标签（需每次指定标签）：\n");
    LOG_I(TAG_SYSTEM, "System message");
    LOG_I(TAG_ADC, "ADC value: %d", 1234);
    
    /* 方式2：自定义字符串标签 */
    printf("\n2. 自定义字符串标签：\n");
    LOG_I("CUSTOM", "Custom tag message");
    LOG_I("MYTAG", "Another custom tag");
    
    /* 方式3：文件级标签（本文件定义了 LOG_TAG = "EXAMPLE"）*/
    printf("\n3. 文件级标签（最简洁，推荐）：\n");
    printf("   本文件开头定义了：#define LOG_TAG \"EXAMPLE\"\n");
    log_i("电机初始化完成");                    // [EXAMPLE ] 
    log_d("PWM频率：%d Hz", 1000);              // [EXAMPLE ]
    log_e("错误码：%d", -1);                    // [EXAMPLE ]
    log_w("温度警告：%d°C", 85);                // [EXAMPLE ]
    
    /* 说明 */
    printf("\n>>> 说明：\n");
    printf("  • 本文件在开头定义了 LOG_TAG = \"EXAMPLE\"\n");
    printf("  • 所以 log_i() 等小写宏自动使用 EXAMPLE 标签\n");
    printf("  • 每个 .c 文件可以定义不同的 LOG_TAG，互不冲突\n");
    printf("  • 如果忘记定义，会显示 [NO_TAG] 作为警示\n");
    
    printf("\n>>> 优势：\n");
    printf("  ✅ 每个文件独立定义，不会冲突\n");
    printf("  ✅ 使用小写宏，代码更简洁\n");
    printf("  ✅ 不定义会显示 [NO_TAG] 作为警示\n");
    
    printf("\n>>> 注意事项：\n");
    printf("  ⚠️  #define LOG_TAG 必须在 #include \"log.h\" 之前\n");
    printf("  ⚠️  每个 .c 文件可以有不同的 LOG_TAG\n");
    printf("  ⚠️  不要在 .h 头文件中定义 LOG_TAG\n");
    
    printf("\n提示：参考 motor.c、sensor.c 等实际模块文件的使用\n");
}

/* ================================ 主函数 ================================ */
int main(void)
{
    /* 初始化日志系统 */
    log_init();
    
    printf("\n");
    printf("╔════════════════════════════════════════════════════════╗\n");
    printf("║                                                        ║\n");
    printf("║             MicroLog 使用示例程序                      ║\n");
    printf("║                                                        ║\n");
    printf("║  版本：v1.1.0                                          ║\n");
    printf("║  日期：2025-10-18                                      ║\n");
    printf("║                                                        ║\n");
    printf("╚════════════════════════════════════════════════════════╝\n");
    
    /* 运行所有示例 */
    example_basic();              // 1. 基础使用
    example_global_level();       // 2. 全局级别控制
    example_module_filter();      // 3. 模块级别过滤
    example_format_config();      // 4. 格式配置
    example_hex_dump();           // 5. HEX转储
    example_raw_output();         // 6. 原始输出
    example_dynamic_control();    // 7. 动态控制
    example_custom_output();      // 8. 自定义输出
    example_real_world();         // 9. 实际应用场景
    example_performance();        // 10. 性能测试
    example_file_tag();           // 11. 文件级标签
    
    printf("\n");
    printf("╔════════════════════════════════════════════════════════╗\n");
    printf("║                                                        ║\n");
    printf("║          所有示例运行完成！                            ║\n");
    printf("║                                                        ║\n");
    printf("║  更多信息请查看：                                      ║\n");
    printf("║  - README.md        : 功能介绍                         ║\n");
    printf("║  - INTEGRATION.md   : 集成指南                         ║\n");
    printf("║                                                        ║\n");
    printf("╚════════════════════════════════════════════════════════╝\n");
    
    /* 反初始化（可选）*/
    log_deinit();
    
    return 0;
}
